
# 一共有7个代码文件，每个文件对应一个最能体现的原则，请找出每个原则对应的代码文件，然后分析该代码文件是如何体现该原则的。

# 请将文件名修改为相应的原则名称，如：1.单一职责原则.py。并回答以下问题。然后将代码文件上传到之前实验创建的码云仓库中。
# 将码云代码仓库里新建文件夹code_snippets，将代码文件放入该文件夹中。

# 1.运行代码
# 输出如下：
    # 用户 101 借阅了图书 B1001
    # 发送邮件给用户 101：你已借阅图书 B1001
    # 用户 101 归还了图书 B1001
    # 发送邮件给用户 101：你已归还图书 B1001

    # 切换到短信通知服务...

    # 用户 102 借阅了图书 B1002
    # 发送短信给用户 102：你已借阅图书 B1002
    # 用户 102 归还了图书 B1002
    # 发送短信给用户 102：你已归还图书 B1002

# 2. 指出该代码体现了哪个原则
    # 体现了依赖倒置原则

# 3. 请说明该代码是如何体现该原则
    # LibraryManagementSystem 类依赖于抽象的 NotificationService 接口，
    # 而不是具体的 EmailNotificationService 或 SMSNotificationService 类。
    # 依赖于抽象，而不是依赖于具体实现。
    # LibraryManagementSystem 在构造函数中接受一个 NotificationService 类型的参数，
    # 这样它就可以与任何实现了 NotificationService 接口的具体通知服务一起工作。


from abc import ABC, abstractmethod

# 抽象通知接口
class NotificationService(ABC):
    @abstractmethod
    def notify(self, user_id, message):
        pass

# 具体的电子邮件通知实现
class EmailNotificationService(NotificationService):
    def notify(self, user_id, message):
        print(f"发送邮件给用户 {user_id}：{message}")

# 具体的短信通知实现
class SMSNotificationService(NotificationService):
    def notify(self, user_id, message):
        print(f"发送短信给用户 {user_id}：{message}")

# 图书管理系统，依赖于抽象的NotificationService接口
class LibraryManagementSystem:
    def __init__(self, notification_service: NotificationService):
        self.notification_service = notification_service

    def borrow_book(self, user_id, book_id):
        # 借书逻辑
        print(f"用户 {user_id} 借阅了图书 {book_id}")
        # 通知用户
        self.notification_service.notify(user_id, f"你已借阅图书 {book_id}")

    def return_book(self, user_id, book_id):
        # 还书逻辑
        print(f"用户 {user_id} 归还了图书 {book_id}")
        # 通知用户
        self.notification_service.notify(user_id, f"你已归还图书 {book_id}")

# 测试示例
if __name__ == "__main__":
    # 使用电子邮件通知服务
    email_service = EmailNotificationService()
    library_system = LibraryManagementSystem(email_service)
    library_system.borrow_book(user_id=101, book_id="B1001")
    library_system.return_book(user_id=101, book_id="B1001")

    print("\n切换到短信通知服务...\n")

    # 使用短信通知服务
    sms_service = SMSNotificationService()
    library_system = LibraryManagementSystem(sms_service)
    library_system.borrow_book(user_id=102, book_id="B1002")
    library_system.return_book(user_id=102, book_id="B1002")
